﻿Public Class MuhCekBasimi
	Inherits Process

	Dim eno As Input

	Public Overrides Sub GenericEvent(ByVal e As ProcessEventArgs)
		Select Case e.EventType
			Case EventType.Initialize
				Start("Çek Basımı", "Ödeme emri numarasını girin.")
				eno = AddOdemeEmri()
				StartBody()
				AddList()
				List.AddColumns("cekno(Ref no.;c;80),tarih(Tarih;d;80),kimlik(Kimlik no.;c;90),kime(Alacaklı;l;100%),miktar(Tutar;m;90),ceknoyeni(Çek no.;c;80)")
			Case EventType.ValidateForm
				Rs = Muhasebe.OdemeEmri.Oku(Remote, eno.Get)
				If Check("eno", Rs.EOF, "Ödeme emri bulunamadı.") Then Return
				If Check("eno", Not IsNull(Rs("onay"), False), "!Bu ödeme emri henüz onaylanmadı.") Then Return
				Rs = Muhasebe.OdemeEmri.CekListesi(Remote, eno.Get)
				List.DataSource = Rs
				If Rs.Exists("ceknoyeni is not null") Then Warning("Dikkat! Bu çekler daha önce basılmıştır.")
				Buttons.Show("Next")
				Help = "Ödeme emrindeki çekler listelenmiştir. Yazdırmak için Devam butonunu kullanın."
				e.Result = True
			Case EventType.Save
				If Rs.Exists("ceknoyeni is not null") Then
					If Not Confirm("Bu çekler daha önce basılmıştır. Devam etmek istiyor musunuz?") Then Return
				End If
				Dim Dialog As New MuhCekBasimiDevam
				Dialog.AddArgument("eno", eno.Get)
				Dialog.AddArgument("cek1", Rs.Min("cekno"))
				Dialog.AddArgument("cek2", Rs.Max("cekno"))
				Window.Launch(Dialog, True)
		End Select
	End Sub

End Class

Public Class MuhCekBasimiDevam
	Inherits Process

	Dim cek1, cek2, secenek, yazici As Input
	Dim CekYazici As New CekYazici

	Public Overrides Sub GenericEvent(ByVal e As ProcessEventArgs)
		Select Case e.EventType
			Case EventType.Initialize
				Start("Çek Basımı", "Basım seçenekleri.")
				secenek = AddCombo("secenek", "Basım", "T,Tüm çekler|Ç,Çek aralığı", "width=12;nl")
				cek1 = AddText("cek1", "Başlangıç", "width=8;nl")
				cek2 = AddText("cek2", "Bitiş", "width=8;nl")
				yazici = AddCombo("yazici", "Çek yazıcısı", "", "width=16;nl")
				Size = New Size(480, 200)
			Case EventType.Shown
				cek1.Set(Arguments("cek1"))
				cek2.Set(Arguments("cek2"))
				secenek.Set("T")
				Dim List As String = ""
				For Each Printer As String In System.Drawing.Printing.PrinterSettings.InstalledPrinters
					If LCase(Printer).Contains("(çek)") Then List &= "|" & Printer
				Next
				If List = "" Then
					Warning("Sisteminize bağlı çek yazıcı bulunamadı. Lütfen yazıcılarınızı kontrol edin.")
					Source("yazici") = "1,(Yazıcı bulunamadı.)"
					yazici.Set("1")
					yazici.Enabled = False
				Else
					yazici.Source = Mid(List, 2)
					yazici.Set(GetSetting("SSD", "Çek", "Yazıcı", "--first--"))
					Buttons.Show("Next")
				End If
			Case EventType.Change
				If e.Name = "secenek" Then
					cek1.Enabled = secenek = "Ç"
					cek2.Enabled = cek1.Enabled
				End If
			Case EventType.Save
				If Not Confirm("Çekler basılacak. Devam etmek istediğinizden emin misiniz?") Then Return
				SaveSetting("SSD", "Çek", "Yazıcı", Me.yazici.Get)
				Rs = Muhasebe.OdemeEmri.CekListesi(Remote, Arguments("eno")).Select("cekno >= " & cek1.Get & " and cekno <= " & cek2.Get)
				Do Until Rs.EOF
					CekYazici.Add(Rs("cekno"), Rs("tarih"), Rs("kime"), Rs("miktar"), Rs("kimlik"), NumberToText(Rs("miktar")))
					Rs.MoveNext()
				Loop
				CekYazici.Printer = yazici.Get
				Dim Text As String = CekYazici.Printer.ToLower
				If Text.Contains("hp") And Text.Contains("1018") Then
					CekYazici.Offset = New Point(0, 0)
				ElseIf Text.Contains("xerox") And Text.Contains("3117") Then
					CekYazici.Offset = New Point(11, 21)
				Else
					If Not Confirm("Seçtiğiniz yazıcının offset özellikleri bilinmiyor. Devam etmek istiyor musunuz?") Then Return
				End If
				CekYazici.Start()
				Info("Çekler yazıcıya gönderildi.")
				Close()
		End Select
	End Sub

End Class

Class CekYazici

	Dim WithEvents Doc As New Printing.PrintDocument
	Dim Cekler As New List(Of Cek)
	Dim Sira As Integer = 0
	Dim G As Graphics
	Public Offset As Point
	Public Printer As String

	Sub Add(CekNo As Integer, Tarih As Date, Alacakli As String, Tutar As Decimal, Kimlik As String, TutarYazi As String)
		Dim Cek As New Cek
		Cekler.Add(Cek)
		Cek.CekNo = CekNo
		Cek.Tarih = Tarih
		Cek.Alacakli = Alacakli
		Cek.Tutar = Tutar
		Cek.Kimlik = Kimlik
		Cek.TutarYazi = TutarYazi
	End Sub

	Sub Start()
		Doc.PrinterSettings.PrinterName = Printer
		Doc.DefaultPageSettings.Landscape = True
		Doc.DefaultPageSettings.Margins = New Printing.Margins(0, 0, 0, 0)
		Sira = 0
		Doc.Print()
	End Sub

	Private Sub Doc_PrintPage(sender As Object, e As System.Drawing.Printing.PrintPageEventArgs) Handles Doc.PrintPage
		Dim Cek As Cek = Cekler(Sira)
		G = e.Graphics
		Print(Format(Cek.Tarih.Day, "00"), 62, 35, 20, 15, 8, "")
		Print(Format(Cek.Tarih.Month, "00"), 96, 35, 20, 15, 8, "")
		Print(Right(Cek.Tarih.Year, 2), 135, 35, 20, 15, 8, "")
		Print(Format(Cek.Tarih.Day, "00"), 687, 3, 20, 12, 8, "")
		Print(Format(Cek.Tarih.Month, "00"), 722, 3, 20, 12, 8, "")
		Print(Right(Cek.Tarih.Year, 2), 765, 3, 20, 12, 8, "")
		Print("--" & Format(Cek.Tutar, "###,###,###,###.00") & "--", 30, 140, 120, 30, 8, "")
		Print("--" & Format(Cek.Tutar, "###,###,###,###.00") & "--", 690, 50, 100, 32, 10, "")
		Print(Cek.Alacakli, 30, 100, 120, 40, 7, "twl")
		Print(Cek.Alacakli, 310, 95, 400, 20, 10, "l")
		Print("-- " & Cek.TutarYazi & " --", 300, 121, 400, 20, 10, "l")
		Print(Cek.CekNo, 30, 220, 120, 30, 8, "")
		Print(Cek.Kimlik, 210, 70, 70, 20, 8, "")
		Sira += 1
		e.HasMorePages = Sira < Cekler.Count
	End Sub

	Sub Print(S As String, x As Integer, y As Integer, w As Integer, h As Integer, Size As Integer, Flags As String)
		Dim F As New StringFormat
		F.Alignment = StringAlignment.Center
		F.LineAlignment = StringAlignment.Center
		If Flags.Contains("l") Then F.Alignment = StringAlignment.Near
		If Flags.Contains("t") Then F.Alignment = StringAlignment.Near
		G.DrawString(S, New Font("segoe ui", Size), Brushes.Black, New Rectangle(Offset.X + x, Offset.Y + y, w, h), F)
	End Sub

	Class Cek
		Public CekNo As Integer
		Public Tarih As Date
		Public Alacakli As String
		Public Tutar As Decimal
		Public Kimlik As String
		Public TutarYazi As String
	End Class

End Class